﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using fideeraSoft.DAO;
using System.Data.SqlClient;
using fideeraSoft.Utils;
using fideeraSoft.Entities;
using System.Windows.Forms;

namespace fideeraSoft.DAOimpl
{
    public class MateriaPrima_X_LoteDAOSQLimpl : MateriaPrima_X_LoteDAO
    {

        #region ALTA MateriaPrima X Lote        
        public void altaMateriaPrima_X_Lote(MateriaPrima materiaPrima, Lote lote, int idMatPrimaXLote)           //SE PODRIA ESTANDARIZAR
        {
            SqlConnection conn = null;
            try
            {
                conn = SQLclass.conectarSQL();
                conn.Open();

                string query = "SET IDENTITY_INSERT MateriaPrima_X_Lote ON; INSERT INTO MateriaPrima_X_Lote (ID,materiaPrima,lote,cantidad) VALUES (@IdMXL,@IdMateriaPrima,@IdLote,@Cantidad)";

                SqlCommand cmd = new SqlCommand(query, conn);

                cmd.Parameters.AddWithValue("@IdMXL", idMatPrimaXLote);
                cmd.Parameters.AddWithValue("@IdMateriaPrima", materiaPrima.IdMateriaPrima);

                cmd.Parameters.AddWithValue("@IdLote", lote.IdLote);

                cmd.Parameters.AddWithValue("@Cantidad", materiaPrima.Cantidad);


                cmd.ExecuteNonQuery();
                //cmd.Parameters.Clear();
                // cmd.CommandText = "SELECT @@IDENTITY";
                // int insertID=Convert.ToInt32(cmd.ExecuteScalar());

                //  cmd.Dispose();
                cmd = null;

            }
            catch (Exception e)
            {
                CLogger.Append("[altaRemitoEntrada] Exception alta: " + e, CLogger.ERROR);      //DEBUG
                throw new MiException("[altaRemitoEntrada] Exception alta: " + e);
            }
            finally
            {
                conn.Close();
            }

        }

        #endregion


        #region BUSCAR ULTIMO ID DE MateriaPrima X Lote
        public int buscarNuevoUltimoIdMateriaPrimaXLoteEnBD()
        {
            int ID = 0;
            SqlConnection conn = SQLclass.conectarSQL();
            try
            {
                conn.Open();

                string query = "SELECT TOP 1 ID FROM MateriaPrima_X_Lote ORDER BY ID DESC ";
                SqlCommand cmd = new SqlCommand(query, conn);

                SQLclass.commandQuery(conn, cmd, query);
                SqlDataReader reader = cmd.ExecuteReader();

                if (reader.HasRows)
                {

                    while (reader.Read())
                    {
                        ID = reader.GetInt32(0);
                        //  CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] ID : " + ID, CLogger.ERROR);      //DEBUG
                    }
                    ID++;
                }
                else
                {
                    ID = 1;
                }
            }
            catch (Exception e)
            {
                CLogger.Append("[buscarNuevoUltimoIdMateriaPrimaXLoteEnBD] Exception : " + e, CLogger.ERROR);      //DEBUG
                throw new MiException("[buscarNuevoUltimoIdMateriaPrimaXLoteEnBD] Exception: " + e);
            }
            finally
            {
                conn.Close();
            }
            // CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] RETURN ID : " + ID, CLogger.ERROR);      //DEBUG
            return ID;
        }

        #endregion


        #region BUSCAR Lista dE MateriasPrimas X Lote por ID
        public List<MateriaPrimaXLotes> buscarListaMateriasPrimasXLotesPorID(int idLote)
        {

            List<MateriaPrimaXLotes> lstMatPrimXLote;
            SqlConnection conn = SQLclass.conectarSQL();
            try
            {
                conn.Open();

                string query = "SELECT * FROM MateriaPrima_X_Lote WHERE lote='" + idLote.ToString() + "'";
                SqlCommand cmd = new SqlCommand(query, conn);

                SQLclass.commandQuery(conn, cmd, query);
                SqlDataReader reader = cmd.ExecuteReader();

                if (reader.HasRows)
                {
                    lstMatPrimXLote = new List<MateriaPrimaXLotes>();
                    while (reader.Read())
                    {
                        MateriaPrimaXLotes matPrimXLotes = new MateriaPrimaXLotes();

                        matPrimXLotes.IdMateriaPrimaXLotes= reader.GetInt32(0);
                        matPrimXLotes.MateriaPrima= reader.GetInt32(1);
                        matPrimXLotes.Lote= reader.GetInt32(2);
                        matPrimXLotes.Cantidad = (float) reader.GetDouble(3);
                        
                        lstMatPrimXLote.Add(matPrimXLotes);
                        //  CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] ID : " + ID, CLogger.ERROR);      //DEBUG
                    }
                }
                else
                {
                    lstMatPrimXLote = null;
                }
            }
            catch (Exception e)
            {
                CLogger.Append("[buscarListaMateriasPrimasXLotesPorID] Exception : " + e, CLogger.ERROR);      //DEBUG
                throw new MiException("[buscarListaMateriasPrimasXLotesPorID] Exception: " + e);
            }
            finally
            {
                conn.Close();
            }
            // CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] RETURN ID : " + ID, CLogger.ERROR);      //DEBUG
            return lstMatPrimXLote;
        }

        #endregion


        #region BUSCAR Lista dE MateriasPrimas X Lote Con cantidad mayor a 0
        public List<MateriaPrimaXLotes> BuscarListaMateriasPrimasXLoteConCantidad()
        {

            List<MateriaPrimaXLotes> lstMatPrimXLote;
            SqlConnection conn = SQLclass.conectarSQL();
            try
            {
                conn.Open();

                string query = "SELECT * FROM MateriaPrima_X_Lote WHERE cantidad > 0 ";
                SqlCommand cmd = new SqlCommand(query, conn);

                SQLclass.commandQuery(conn, cmd, query);
                SqlDataReader reader = cmd.ExecuteReader();

                if (reader.HasRows)
                {
                    lstMatPrimXLote = new List<MateriaPrimaXLotes>();
                    while (reader.Read())
                    {
                        MateriaPrimaXLotes matPrimXLotes = new MateriaPrimaXLotes();

                        matPrimXLotes.IdMateriaPrimaXLotes = reader.GetInt32(0);
                        matPrimXLotes.MateriaPrima = reader.GetInt32(1);
                        matPrimXLotes.Lote = reader.GetInt32(2);
                        matPrimXLotes.Cantidad = (float)reader.GetDouble(3);

                        lstMatPrimXLote.Add(matPrimXLotes);
                        //  CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] ID : " + ID, CLogger.ERROR);      //DEBUG
                    }
                }
                else
                {
                    lstMatPrimXLote = null;
                }
            }
            catch (Exception e)
            {
                CLogger.Append("[getListaMateriasPrimasXLoteConCantidad] Exception : " + e, CLogger.ERROR);      //DEBUG
                throw new MiException("[getListaMateriasPrimasXLoteConCantidad] Exception: " + e);
            }
            finally
            {
                conn.Close();
            }
            // CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] RETURN ID : " + ID, CLogger.ERROR);      //DEBUG
            return lstMatPrimXLote;
        }

        #endregion


        

        #region BUSCAR MateriasPrimas X Lote POR ID MATERIA PRIMA Y ID LOTE
        public MateriaPrimaXLotes buscarMateriaPrimaXLotePorIdMatYLote(MateriaPrima matPrima)
        {

            MateriaPrimaXLotes matPrimXLote;

            SqlConnection conn = SQLclass.conectarSQL();
            try
            {
                conn.Open();

                string query = "SELECT * FROM MateriaPrima_X_Lote WHERE materiaPrima='"+matPrima.IdMateriaPrima+"' AND lote='"+matPrima.IdLote+"'";

                SqlCommand cmd = new SqlCommand(query, conn);

                SQLclass.commandQuery(conn, cmd, query);
                SqlDataReader reader = cmd.ExecuteReader();

                if (reader.HasRows)
                {
                    matPrimXLote = new MateriaPrimaXLotes();

                    while (reader.Read())
                    {
                        
                        matPrimXLote.IdMateriaPrimaXLotes = reader.GetInt32(0);
                        matPrimXLote.MateriaPrima = reader.GetInt32(1);
                        matPrimXLote.Lote = reader.GetInt32(2);
                        matPrimXLote.Cantidad = (float)reader.GetDouble(3);

                        
                        //  CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] ID : " + ID, CLogger.ERROR);      //DEBUG
                    }
                }
                else
                {
                    matPrimXLote = null;
                }
            }
            catch (Exception e)
            {
                CLogger.Append("[buscarMateriaPrimaXLotePorIdMatYLote] Exception : " + e, CLogger.ERROR);      //DEBUG
                throw new MiException("[buscarMateriaPrimaXLotePorIdMatYLote] Exception: " + e);
            }
            finally
            {
                conn.Close();
            }
            // CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] RETURN ID : " + ID, CLogger.ERROR);      //DEBUG
            return matPrimXLote;
        }

        #endregion


        #region UPDATE CANTIDAD DE MATERIAS PRIMA POR LOTE
        public void updateCantidadesMateriaPrimaXLote(MateriaPrimaXLotes matPrimaXLote)
        {

            SqlConnection conn = SQLclass.conectarSQL();
            try
            {
                conn.Open();

                string query = "UPDATE MateriaPrima_X_Lote SET cantidad=@Cantidad WHERE ID=@Id";
                
                SqlCommand cmd = new SqlCommand(query, conn);

                cmd.Parameters.AddWithValue("@Cantidad", matPrimaXLote.Cantidad);
                cmd.Parameters.AddWithValue("@Id", matPrimaXLote.IdMateriaPrimaXLotes);
                
                

                cmd.ExecuteNonQuery();
                
                cmd = null;
            }
            catch (Exception e)
            {
                CLogger.Append("[updateCantidadesMateriaPrimaXLote] Exception : " + e, CLogger.ERROR);      //DEBUG
                throw new MiException("[updateCantidadesMateriaPrimaXLote] Exception: " + e);
            }
            finally
            {
                conn.Close();
            }
            // CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] RETURN ID : " + ID, CLogger.ERROR);      //DEBUG
            
        }

        #endregion


        #region OBTENER CANTIDAD TOTAL MATERIA PRIMA X LOTE Por ID

        public double obtenerCantidadTotalMateriaPrima_X_LotePorId(string idMatPrima)
        {
            double cant = 0;
            SqlConnection conn = SQLclass.conectarSQL();
            try
            {
                conn.Open();

                string query = "SELECT SUM(cantidad) AS Cantidad FROM MateriaPrima_X_Lote WHERE materiaPrima='" + idMatPrima + "'";
                
                //MessageBox.Show("QUERY: "+query, "INFO", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); //DEBUG

                SqlCommand cmd = new SqlCommand(query, conn);

                SQLclass.commandQuery(conn, cmd, query);
                SqlDataReader reader = cmd.ExecuteReader();

                if (reader.HasRows)
                {
                    
                    while (reader.Read())
                    {
                        cant = reader.GetDouble(0);
                       // MessageBox.Show("CANT: " + cant.ToString(), "INFO", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); //DEBUG
                    }

                }
                else
                {
                    cant = -1;
                }
            }
            catch (Exception e)
            {
                CLogger.Append("[obtenerCantidadTotalMateriaPrima_X_LotePorId] Exception : " + e, CLogger.ERROR);      //DEBUG
                throw new MiException("[obtenerCantidadTotalMateriaPrima_X_LotePorId] Exception: " + e);
            }
            finally
            {
                conn.Close();
            }
            // CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] RETURN ID : " + ID, CLogger.ERROR);      //DEBUG
            return cant;
        }

        #endregion


        #region ELIMINAR TODAS LAS MATERIAs PRIMAs X LOTE EN DB
        public void eliminarMateriaPrimasXLotesPorId(int id)
        {
            SqlConnection conn = SQLclass.conectarSQL();
            try
            {
                conn.Open();

                string query = "DELETE FROM MateriaPrima_X_Lote WHERE ID='"+id.ToString()+"'";
                SqlCommand cmd = new SqlCommand(query, conn);
                cmd.ExecuteNonQuery();

            }
            catch (Exception e)
            {
                CLogger.Append("[eliminarTodasLasMateriasPrimasXLotesEnDb] Exception : " + e, CLogger.ERROR);      //DEBUG
                throw new MiException("[eliminarTodasLasMateriasPrimasXLotesEnDb] Exception: " + e);
            }
            finally
            {
                conn.Close();
            }
        }

        #endregion



        #region ELIMINAR TODAS LAS MATERIAs PRIMAs X LOTE EN DB
        public void eliminarTodasLasMateriasPrimasXLotesEnDb()
        {
            SqlConnection conn = SQLclass.conectarSQL();
            try
            {
                conn.Open();

                string query = "DELETE FROM MateriaPrima_X_Lote";
                SqlCommand cmd = new SqlCommand(query, conn);
                cmd.ExecuteNonQuery();

            }
            catch (Exception e)
            {
                CLogger.Append("[eliminarTodasLasMateriasPrimasXLotesEnDb] Exception : " + e, CLogger.ERROR);      //DEBUG
                throw new MiException("[eliminarTodasLasMateriasPrimasXLotesEnDb] Exception: " + e);
            }
            finally
            {
                conn.Close();
            }
        }

        #endregion


    }
}
